第VI章. 部署 Spring Boot 应用程序

Spring Boot的灵活打包选项在部署应用程序时提供了大量的选择,你可以将Spring Boot应用程序部署到各种云平台、容器映像(例如Docker)或虚拟/真实机器上。

本节介绍一些更常见的部署场景。

60. 部署到云

Spring Boot的可执行jar是为大多数流行的云PaaS(Platform-as-a-Service)提供者准备的,这些供应商倾向于要求你“自带容器”,它们管理应用程序进程(不是专门的Java应用程序),因此,他们需要一个中间层,使你的应用程序适应云的运行进程理念。

两家受欢迎的云服务提供商Heroku和cloud Foundry采用了“buildpack”的方法,“buildpack”将你部署的代码封装到任何需要启动应用程序的地方,它可能是一个JDK和一个对java的调用,一个嵌入式web服务器,或者一个成熟的应用服务器。buildpack是可插拔的,但理想情况下,你应该能够通过尽可能少的自定义来获取它,这将减少不受你控制的功能的占用,它将开发和生产环境之间的差异最小化。

理想情况下,你的应用程序,就像Spring Boot的可执行jar,拥有它需要在其中运行的所有东西。

在本节中,我们将讨论如何获得在开始章节我们开发的简单应用程序,并在云中运行。

60.1 Cloud Foundry

如果没有指定其他的buildpack, Cloud Foundry提供了默认的buildpack,Cloud Foundry的Java buildpack对Spring应用程序(包括Spring Boot)有很好的支持,你可以部署独立的可执行的jar应用程序和传统的.war打包应用程序。

一旦你构建了应用程序(例如,通过使用mvn clean package)并安装了cf命令行工具,就可以使用cf push命令部署应用程序,将路径替换为已编译的.jar。在推送应用程序之前,确定已经登录了cf命令行客户端。下面的行显示使用cf push命令来部署应用程序:

$ cf push acloudyspringtime -p target/demo-0.0.1-SNAPSHOT.jar
在前面的示例中,我们将acloudyspringtime替换为您提供的cf作为应用程序名称的任何值。

更多选项见cf push文档,如果一个Cloud Foundry的manifest.yml文件存在同一目录,它将被认可。

此时,cf开始上传你的应用程序,产生类似以下示例的输出:

Uploading acloudyspringtime... OK
Preparing to start acloudyspringtime... OK
-----> Downloaded app package (8.9M)
-----> Java Buildpack Version: v3.12 (offline) | https://github.com/cloudfoundry/java-
buildpack.git#6f25b7e
-----> Downloading Open Jdk JRE 1.8.0_121 from https://java-buildpack.cloudfoundry.org/openjdk/
trusty/x86_64/openjdk-1.8.0_121.tar.gz (found in cache)
       Expanding Open Jdk JRE to .java-buildpack/open_jdk_jre (1.6s)
-----> Downloading Open JDK Like Memory Calculator 2.0.2_RELEASE from https://java-
buildpack.cloudfoundry.org/memory-calculator/trusty/x86_64/memory-calculator-2.0.2_RELEASE.tar.gz 
(found in cache)
       Memory Settings: -Xss349K -Xmx681574K -XX:MaxMetaspaceSize=104857K -Xms681574K -
XX:MetaspaceSize=104857K
-----> Downloading Container Certificate Trust Store 1.0.0_RELEASE from https://java-
buildpack.cloudfoundry.org/container-certificate-trust-store/container-certificate-trust-
store-1.0.0_RELEASE.jar (found in cache)
       Adding certificates to .java-buildpack/container_certificate_trust_store/truststore.jks 
       (0.6s)
-----> Downloading Spring Auto Reconfiguration 1.10.0_RELEASE from https://java-
buildpack.cloudfoundry.org/auto-reconfiguration/auto-reconfiguration-1.10.0_RELEASE.jar 
(found in cache)
Checking status of app 'acloudyspringtime'...
  0 of 1 instances running (1 starting)
  ...
  0 of 1 instances running (1 starting)
  ...
  0 of 1 instances running (1 starting)
  ...
  1 of 1 instances running (1 running)
App started

恭喜你!应用程序现在是存活的!

一旦你的应用程序被激活,你可以使用cf apps命令来验证已部署应用程序的状态,如下面的示例所示:

$ cf apps
Getting applications in ...
OK

name                 requested state   instances   memory   disk   urls
...
acloudyspringtime    started           1/1         512M     1G     acloudyspringtime.cfapps.io
...

一旦Cloud Foundry承认你的应用程序已被部署,你应该能够在给定的URI中找到应用程序,在前面的示例中,你可以在http://acloudyspringtime.cfapps.io/中找到它。

60.1.1 绑定到服务

默认情况下,关于正在运行的应用程序和服务连接信息的元数据将被作为环境变量公开(例如:$VCAP_SERVICES),这个架构的决定是由于Cloud Foundry的多种语言性质(任何语言和平台都可以作为一个buildpack来支持),进程范围的环境变量是语言无关的。

环境变量并不总是适合最简单的API,因此,Spring Boot会自动提取它们并将数据压缩到可以通过Spring的Environment抽象访问的属性中,如下面的示例所示:

@Component
class MyBean implements EnvironmentAware { 

   private String instanceId;

   @Override
   public void setEnvironment(Environment environment) {
      this.instanceId = environment.getProperty("vcap.application.instance_id");
   }
   // ...
}

所有的Cloud Foundry属性都以vcap为前缀,可以使用vcap属性访问应用程序信息(例如应用程序的公共URL)和服务信息(如数据库证书),有关详细信息,请参阅“CloudFoundryVcapEnvironmentPostProcessor”Javadoc。

Spring Cloud Connectors项目更适合于配置数据源等任务,Spring Boot包括自动配置支持和spring-boot-starter-cloud-connectors启动器。

60.2 Heroku


博弈
2.5k 声望1.5k 粉丝

态度决定一切